package online.longzipeng;

import java.util.*;

/**
 * @Author: lzp
 * @description: 查找共用字符
 * 给你一个字符串数组 words ，请你找出所有在 words 的每个字符串中都出现的共用字符（ 包括重复字符），并以数组形式返回。你可以按 任意顺序 返回答案。
 * 示例 1：
 * <p>
 * 输入：words = ["bella","label","roller"]
 * 输出：["e","l","l"]
 * 示例 2：
 * <p>
 * 输入：words = ["cool","lock","cook"]
 * 输出：["c","o"]
 * @Date: 2023/10/25
 */
public class Solution1002 {

	/**
	 * 因为在每个字符串中都出现过，所以只需要遍历每个字符串，存储相同字符的最小出现次数，即为最终结果
	 * @param words
	 * @return
	 */
	public static List<String> commonChars(String[] words) {
		// 因为题干说明是小字母，所以直接可以取巧使用26个空间，对应下标与 字符a，做加法即可得到其他字母
		int[] minfreq = new int[26];
		// 默认给极大值，因为不知道极限会出现多少次
		Arrays.fill(minfreq, Integer.MAX_VALUE);
		for (String word : words) {
			int[] freq = new int[26];
			int length = word.length();
			for (int i = 0; i < length; ++i) {
				char ch = word.charAt(i);
				// 刚好26个字母位-字符a得到对应的索引，然后直接+1得当当前字符串的该字符出现次数
				++freq[ch - 'a'];
			}
			for (int i = 0; i < 26; ++i) {
				// 与当前记录的最小出现次数做比较
				minfreq[i] = Math.min(minfreq[i], freq[i]);
			}
		}

		List<String> ans = new ArrayList<String>();
		for (int i = 0; i < 26; ++i) {
			for (int j = 0; j < minfreq[i]; ++j) {
				ans.add(String.valueOf((char) (i + 'a')));
			}
		}
		return ans;
	}

	public static void main(String[] args) {
		System.out.println(commonChars(new String[]{"bella", "label", "roller"}));
		System.out.println(commonChars(new String[]{"cool", "lock", "cook"}));
	}

}
